#include "widget_funcd_weather.h"
#include "ui_widget_funcd_weather.h"




Widget_funcD_Weather::Widget_funcD_Weather(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget_funcD_Weather)
{
    ui->setupUi(this);

    /************************* 数据库操作 *************************/

    // 初始化数据库
    this->db = new Widget_assist_Weather_Datebase(this);


//    // 查询数据  点击查询之后获取text
//    QString cityId= db->Find_id_form_city("北京");
//    qDebug() << "id = " << cityId;
//    // 拼接URL
//    QString baseUrl = "http://t.weather.itboy.net/api/weather/city/";
//    QString fullUrl = baseUrl + cityId;

//    qDebug() << "完整的URL是：" << fullUrl;

    /************************* 数据库操作 *************************/




    /************************** HTTP操作 ***********************************/
    // 设定 网络对象
    Network_Http = new QNetworkAccessManager(this);

    // QUrl url("http://t.weather.itboy.net/api/weather/city/101010100");
    // QUrl url(fullUrl);
    // Network_Http->get(QNetworkRequest(url));

    // 连接信号 当有数据的时候 进行处理
    connect(Network_Http, &QNetworkAccessManager::finished, this, [=](QNetworkReply *reply){
        // reply 包含了数据
        // 响应的状态码为200, 表示请求成功
        int status_code =  reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();

        qDebug() << "operation:" << reply->operation();         // 请求方式
        qDebug() << "status code:" << status_code;              // 状态码
        qDebug() << "url:" << reply->url();                     // url
        qDebug() << "raw header:" << reply->rawHeaderList();    // header

        // 将JSON数据转为utf-8类型
        QByteArray reply_data = reply->readAll();
        QByteArray byteArray  = QString(reply_data).toUtf8();
        // 输出JSON数据
        qDebug() << "read all:" << byteArray.data();


        // 解JSON----------------------- 解JSON ------------------------
        parssWeatherDate(byteArray.data());

        // 获取数据显示到界面上
    });

    /***************************** 查询 ********************************/
    // 点击 查询获取数据
    connect(ui->pushButton,&QPushButton::clicked,[=](){
        // 查询数据  点击查询之后获取text
        //QString cityId= db->Find_id_form_city("北京");
        QString cityId = db->Find_id_form_city(ui->lineEdit->text());
        qDebug() << "id = " << cityId;

        if("-1" != cityId){
            // 拼接URL
            QString baseUrl = "http://t.weather.itboy.net/api/weather/city/";
            QString fullUrl = baseUrl + cityId;
            qDebug() << "完整的URL是：" << fullUrl;
            // get 请求
             QUrl url(fullUrl);
             Network_Http->get(QNetworkRequest(url));
           }
        else {
             qDebug() << "没有这个城市" ;
        }
    });

    /********************* 绘画温度曲线 *******************/
    // ui->label_30->data_val_high[0] ;

}

Widget_funcD_Weather::~Widget_funcD_Weather()
{
    db->close();
    delete ui;
}


// 解JSON的函数
void Widget_funcD_Weather::parssWeatherDate(const QByteArray &jsonData)
{
    // 解析 JSON 文档
    QJsonDocument doc = QJsonDocument::fromJson(jsonData);
    if (doc.isNull()) {
        qDebug() << "Failed to create JSON doc.";
        return;
    }
    if (!doc.isObject()) {
        qDebug() << "JSON is not an object.";
        return;
    }

    QJsonObject jsonObject = doc.object();

    // 获取城市信息
    QJsonObject cityInfo = jsonObject["cityInfo"].toObject();
    QString city = cityInfo["city"].toString();             // 城市名
    QString updateTime = cityInfo["updateTime"].toString(); // 天气的更新时间

    // 获取当前天气数据
    QJsonObject data = jsonObject["data"].toObject();
    QString currentTemperature = data["wendu"].toString();//当前温度
    QString humidity = data["shidu"].toString();          //湿度
    double pm25 = data["pm25"].toDouble();                //pm2.5
    QString airQuality = data["quality"].toString();      //质量
    QString healthAdvice = data["ganmao"].toString();     //建议


    // 存储今天和未来七天的天气预报
    // QList<WeatherDay> forecast;
    // std::vector<WeatherDay> forecast; // 定义为成员变量
    // 解析未来七天的天气预报
    QJsonArray forecastArray = data["forecast"].toArray();
    // 遍历 forecastArray 中的每一个元素，并只取前7个有效对象
    int count = 0;
    for (const QJsonValue &value : forecastArray) {
        if (count >= 7) break; // 如果已经处理了7个元素，则退出循环
        if (value.isObject()) {
            forecast.push_back(WeatherDay(value.toObject()));
            ++count; // 只有当 value 是对象时才增加计数器
        }
    }

    // 将七天最高温最低温 填充到 两个数组中

    // 将容器第一个数据提取出来 (容器中第一个元素就是当天的天气情况）
    // UI更新
    ui->label_weather_city_text->setText(city);          // 城市显示
    ui->label_Weather_wendu->setText(currentTemperature + QString("℃"));// 温度显示
    ui->label_weather_shidu->setText(QString("湿度：")+humidity);// 湿度显示
    ui->label_weather_PM2_5->setText(QString("PM2.5：")+QString::number(pm25));// PM2.5显示
    ui->label_weathere_fengsu->setText(QString("风速：") + forecast.at(0).windLevel);// 风速显示
    ui->label->setPixmap(Disp_pixmap_form_week_tianqi(forecast.at(0).weatherType));// 图片显示
    // 时间显示
    QTime m_time;
    m_time = QTime::currentTime();
    //转换类型
    QString time_str = m_time.toString(QString("H:m:s a"));
    ui->label_Weather_time->setText( forecast.at(0).week + time_str);// 显示时间
    ui->label_weather_text->setText(forecast.at(0).weatherType);// 显示天气状态

    // 遍历数组并对界面进行更新
    travel_vector(forecast);

//    // 输出基本信息
//    qDebug() << "City:" << city;

//    // 输出当前天气信息
//    qDebug() << "Current Temperature:" << currentTemperature;
//    qDebug() << "Humidity:" << humidity;
//    qDebug() << "PM2.5:" << pm25;
//    qDebug() << "Air Quality:" << airQuality;
//    qDebug() << "Health Advice:" << healthAdvice;


}

// 输入天气返回一个图片类型
QPixmap Widget_funcD_Weather::Disp_pixmap_form_week_tianqi(QString str)
{
    if( "晴" == str )
    {
        return QPixmap(":/晴天_白天");
    }
    else if( "多云" == str)
    {
        return QPixmap(":/多云");
    }
    else if( "阴" == str)
    {
        return QPixmap(":/阴天");
    }
    else if( "小雨" == str)
    {
        return QPixmap(":/小雨");
    }
    else if( "中雨" == str)
    {
        return QPixmap(":/中雨");
    }
    else if( "大雨" == str)
    {
        return QPixmap(":/大雨");
    }
    else if( "霾" == str)
    {
        return QPixmap(":/霾");
    }

    qDebug() << "没有匹配的天气" ;
    return QPixmap(":/大雾");

}

// 遍历数组并对界面进行更新
void Widget_funcD_Weather::travel_vector(const std::vector<WeatherDay> &forecast)
{
    for (auto it = forecast.begin(); it != forecast.end(); ++it) {
       if( "星期一" == it->week )
       {
           // 设置图
           ui->label_week_1_icon->setPixmap(Disp_pixmap_form_week_tianqi(it->weatherType));
           // 设置最高温最低温
           ui->label_week_1_wendu->setText( extractTemperature(it->lowTemp) + QString("~") + extractTemperature(it->highTemp) + QString("℃"));

           // 获取高低温
           ui->label_30->data_val_high[1] =  extractTemperature(it->highTemp).toInt();
           ui->label_30->data_val_low[1] =  extractTemperature(it->lowTemp).toInt();
       }
       if( "星期二" == it->week )
       {
           // 设置图
           ui->label_week_2_icon->setPixmap(Disp_pixmap_form_week_tianqi(it->weatherType));
           // 设置最高温最低温
           ui->label_week_2_wendu->setText( extractTemperature(it->lowTemp) + QString("~") + extractTemperature(it->highTemp) + QString("℃"));

           // 获取高低温
           ui->label_30->data_val_high[2] =  extractTemperature(it->highTemp).toInt();
           ui->label_30->data_val_low[2] =  extractTemperature(it->lowTemp).toInt();
       }
       if( "星期三" == it->week )
       {
           // 设置图
           ui->label_week_3_icon->setPixmap(Disp_pixmap_form_week_tianqi(it->weatherType));
           // 设置最高温最低温
           ui->label_week_3_wendu->setText( extractTemperature(it->lowTemp) + QString("~") + extractTemperature(it->highTemp) + QString("℃"));

           // 获取高低温
           ui->label_30->data_val_high[3] =  extractTemperature(it->highTemp).toInt();
           ui->label_30->data_val_low[3] =  extractTemperature(it->lowTemp).toInt();
       }
       if( "星期四" == it->week )
       {
           // 设置图
           ui->label_week_4_icon->setPixmap(Disp_pixmap_form_week_tianqi(it->weatherType));
           // 设置最高温最低温
           ui->label_week_4_wendu->setText( extractTemperature(it->lowTemp) + QString("~") + extractTemperature(it->highTemp) + QString("℃"));

           // 获取高低温
           ui->label_30->data_val_high[4] =  extractTemperature(it->highTemp).toInt();
           ui->label_30->data_val_low[4] =  extractTemperature(it->lowTemp).toInt();
       }
       if( "星期五" == it->week )
       {
           // 设置图
           ui->label_week_5_icon->setPixmap(Disp_pixmap_form_week_tianqi(it->weatherType));
           // 设置最高温最低温
           ui->label_week_5_wendu->setText( extractTemperature(it->lowTemp) + QString("~") + extractTemperature(it->highTemp) + QString("℃"));

           // 获取高低温
           ui->label_30->data_val_high[5] =  extractTemperature(it->highTemp).toInt();
           ui->label_30->data_val_low[5] =  extractTemperature(it->lowTemp).toInt();
       }
       if( "星期六" == it->week )
       {
           // 设置图
           ui->label_week_6_icon->setPixmap(Disp_pixmap_form_week_tianqi(it->weatherType));
           // 设置最高温最低温
           ui->label_week_6_wendu->setText( extractTemperature(it->lowTemp) + QString("~") + extractTemperature(it->highTemp) + QString("℃"));

           // 获取高低温
           ui->label_30->data_val_high[6] =  extractTemperature(it->highTemp).toInt();
           ui->label_30->data_val_low[6] =  extractTemperature(it->lowTemp).toInt();
       }
       if( "星期日" == it->week )
       {
           // 设置图
           ui->label_week_7_icon->setPixmap(Disp_pixmap_form_week_tianqi(it->weatherType));
           // 设置最高温最低温
           ui->label_week_7_wendu->setText( extractTemperature(it->lowTemp) + QString("~") + extractTemperature(it->highTemp) + QString("℃"));

           // 获取高低温
           ui->label_30->data_val_high[0] =  extractTemperature(it->highTemp).toInt();
           ui->label_30->data_val_low[0] =  extractTemperature(it->lowTemp).toInt();
       }

       // 更新绘画
       ui->label_30->update();

    }
}

QString Widget_funcD_Weather::extractTemperature(const QString &input)
{
    // 移除所有非数字字符
    QString numberString = input;
    numberString.remove(QString("℃"), Qt::CaseInsensitive); // 移除摄氏度符号
    numberString.remove(QRegularExpression("[^\\d]"));     // 移除所有非数字字符

    bool ok;
    int temperature = numberString.toInt(&ok);
    if (ok) {
        qDebug() << "Extracted temperature:" << temperature;
    } else {
        qDebug() << "Failed to extract temperature from" << input;
    }

    return QString::number(temperature);

}


